#ifndef GESTORVARIABLES_H
#define GESTORVARIABLES_H

#include <QMap>
#include <QXmlAttributes>
#include "basedatos.h"
#include "consulta.h"
#include "factoriavariables.h"
#include "compiladorexpresiones.h"
#include "simboloinforme.h"

class VariableInforme : public Variable
{
public:
    VariableInforme(SimboloInforme* simbolo) {
        this->simbolo = simbolo;
    }

    Valor getValor() const {
        return simbolo->getValor();
    }

private:
    SimboloInforme* simbolo;
};

class GestorVariables : public FactoriaVariables
{
public:
    GestorVariables();
    ~GestorVariables();

    bool declararBaseDatos(const QString& api, const QString& tipo, const QString& nombre,
        const QString& host, const QString& nombreBd, const QString& usuario, const QString& contrasen);
    bool declararConsulta(const QString& nombre, const QString& sql, const QString& nombreBD);
    bool declararVariable(const QString& nombre, const QString& tipo, const QString& valor);

    BaseDatos* buscarBaseDatos(const QString& nombreBD);
    Consulta* buscarConsulta(const QString& nombreConsulta);
    SimboloInforme* buscarSimbolo(const QString& nombreSimbolo);

    Variable* crearVariable(const QString& nombre);
    Funcion* crearFuncion(const QString& nombre);

    NodoExpresion* compilar(const QString& expresion);

    QString getUltimoError() { return mensajeError; }

protected:
    void error(const QString& mensaje) { mensajeError = mensaje; }

private:    
    CompiladorExpresiones compilador;

    QMap<QString, BaseDatos*> mapaBaseDatos;
    QMap<QString, Consulta*> mapaConsultas;
    QMap<QString, SimboloInforme*> mapaSimbolos;

    QString mensajeError;
};

#endif // GESTORVARIABLES_H
